package br.com.puertorico.common.utils;

import java.util.regex.Pattern;

public class Validate {

	/**
	 * M&eacute;todo que recebe uma string com o cnpj (com '.' '/' '-' ou
	 * n&atilde;o) e verifica se o n&uacute;mero &eacute; um cnpj v&aacute;lido.
	 *
	 * @param cpf
	 * @return {@link Boolean} <code>true</code> se o cnpj for v&aacute;lido,
	 *         <code>false</code> caso contr&aacute;rio.
	 */
	public static Boolean validarCNPJ(String cnpj) {
		cnpj = cnpj.replaceAll("[\\.|\\-|/]", "");
		int soma = 0, dig;
		String cnpjCalc = cnpj.substring(0, 12);

		char[] chrCnpj = cnpj.toCharArray();

		/* Primeira parte */
		for (int i = 0; i < 4; i++) {
			if (chrCnpj[i] - 48 >= 0 && chrCnpj[i] - 48 <= 9) {
				soma += (chrCnpj[i] - 48) * (6 - (i + 1));
			}
		}
		for (int i = 0; i < 8; i++) {
			if (chrCnpj[i + 4] - 48 >= 0 && chrCnpj[i + 4] - 48 <= 9) {
				soma += (chrCnpj[i + 4] - 48) * (10 - (i + 1));
			}
		}
		dig = 11 - (soma % 11);

		cnpjCalc += (dig == 10 || dig == 11) ? "0" : Integer.toString(dig);

		soma = 0;
		for (int i = 0; i < 5; i++) {
			if (chrCnpj[i] - 48 >= 0 && chrCnpj[i] - 48 <= 9) {
				soma += (chrCnpj[i] - 48) * (7 - (i + 1));
			}
		}
		for (int i = 0; i < 8; i++) {
			if (chrCnpj[i + 5] - 48 >= 0 && chrCnpj[i + 5] - 48 <= 9) {
				soma += (chrCnpj[i + 5] - 48) * (10 - (i + 1));
			}
		}
		dig = 11 - (soma % 11);
		cnpjCalc += (dig == 10 || dig == 11) ? "0" : Integer.toString(dig);

		return cnpj.equals(cnpjCalc);
	}

	/**
	 * M&eacute;todo que recebe uma string com o cpf (com '.' e '-' ou
	 * n&atilde;o) e verifica se o n&uacute;mero &eacute; um cpf v&aacute;lido.
	 *
	 * @param cpf
	 * @return {@link Boolean} <code>true</code> se o cpf for v&aacute;lido,
	 *         <code>false</code> caso contr&aacute;rio.
	 */
	public static Boolean validarCPF(String cpf) {
		cpf = cpf.replaceAll("[\\.|\\-]", "");

		int d1, d2;
		int digito1, digito2, resto;
		int digitoCPF;
		String nDigResult;

		d1 = 0;
		d2 = 0;
		digito1 = 0;
		digito2 = 0;
		resto = 0;

		if (cpf.length() < 11) {
			return false;
		}

		for (int nCount = 1; nCount < cpf.length() - 1; nCount++) {
			digitoCPF = Integer.valueOf(cpf.substring(nCount - 1, nCount))
					.intValue();

			d1 = d1 + (11 - nCount) * digitoCPF;
			d2 = d2 + (12 - nCount) * digitoCPF;
		}

		resto = (d1 % 11);

		digito1 = (resto < 2) ? 0 : 11 - resto;

		d2 += 2 * digito1;

		resto = (d2 % 11);

		digito2 = (resto < 2) ? 0 : 11 - resto;

		String nDigVerific = cpf.substring(cpf.length() - 2, cpf.length());

		nDigResult = String.valueOf(digito1) + String.valueOf(digito2);
		return nDigVerific.equals(nDigResult);
	}

	/**
	 * Um login somente ser&aacute; considerado v&aacute;lido se possuir o
	 * m&iacute;nimo 3 caracteres e for composto por letras sem
	 * acentua&ccedil;&atilde;o, n&uacute;meros ou os caracteres <strong> .
	 * </strong> (ponto) e <strong>_</strong> (underline)
	 * <p>
	 * Ex1: daniel.camargo <br />
	 * Ex2: daniel_camargo80
	 * </p>
	 * <hr />
	 * Express&atilde;o regular: <strong>^([\w\d\._]{3,})$</strong>
	 * <hr />
	 *
	 * @param value
	 * @return
	 */
	public static boolean validarLogin(String value) {
		Pattern p = Pattern.compile("^([\\w\\d\\._]{3,})$");
		return p.matcher(value).matches();
	}

	/**
	 * Somente ser&atilde;o aceitas senhas com <strong>6</strong> ou mais
	 * caracteres compostas de letras sem acentua&ccedil;&atilde;o,
	 * n&uacute;meros ou pelos seguintes caracteres de seguran&ccedil;a:
	 * <p>
	 * !, #, $, @, %, ?, *
	 * </p>
	 * <hr />
	 * Express&atilde;o regular: <strong>^([\w\d\.\-_!#\$@%\?\*]{6,})$</strong>
	 * <hr />
	 *
	 * @param value
	 * @return
	 */
	public static boolean validarSenha(String value) {
		Pattern p = Pattern.compile("^([\\w\\d_!#\\$@%\\?\\*]{6,})$");
		return p.matcher(value).matches();
	}

	/**
	 * Validar para ver se o CEP tem 8 d&iacute;gitos.
	 *
	 * @param value
	 * @return
	 */
	public static boolean validarCEP(String value) {
		return value.replaceAll("\\D", "").length() == 8;
	}

}
